home *** CD-ROM | disk | FTP | other *** search
/ HAM Radio 3.2 / Ham Radio Version 3.2 (Chestnut CD-ROMs)(1993).ISO / packet / n17jsrc / config.c < prev    next >
C/C++ Source or Header  |  1991-08-14  |  22KB  |  932 lines

  1. /* A collection of stuff heavily dependent on the configuration info
  2.  * in config.h. The idea is that configuration-dependent tables should
  3.  * be located here to avoid having to pepper lots of .c files with #ifdefs,
  4.  * requiring them to include config.h and be recompiled each time config.h
  5.  * is modified.
  6.  *
  7.  * Copyright 1991 Phil Karn, KA9Q
  8.  */
  9.  /* Mods by PA0GRI */
  10.  
  11. #include <stdio.h>
  12. #include <dos.h>
  13. #include "global.h"
  14. #include "config.h"
  15. #include "mbuf.h"
  16. #include "timer.h"
  17. #include "proc.h"
  18. #include "iface.h"
  19. #include "ip.h"
  20. #include "tcp.h"
  21. #include "udp.h"
  22. #ifdef    ARCNET
  23. #include "arcnet.h"
  24. #endif
  25. #include "lapb.h"
  26. #include "ax25.h"
  27. #include "enet.h"
  28. #include "kiss.h"
  29. #include "netrom.h"
  30. #include "nr4.h"
  31. #include "pktdrvr.h"
  32. #include "ppp.h"
  33. #include "slip.h"
  34. #include "arp.h"
  35. #include "icmp.h"
  36. #include "hardware.h"    /***/
  37. #include "usock.h"
  38. #include "cmdparse.h"
  39. #include "commands.h"
  40. #include "mailbox.h"
  41. #include "ax25mail.h"
  42. #include "nr4mail.h"
  43. #include "tipmail.h"
  44. #include "bootp.h"
  45. #include "daemon.h"
  46. #include "slhc.h"
  47. #include "rspf.h"
  48.  
  49. int dotest __ARGS((int argc,char *argv[],void *p));    /**/
  50. static int dostart __ARGS((int argc,char *argv[],void *p));
  51. static int dostop __ARGS((int argc,char *argv[],void *p));
  52.  
  53. #ifdef    AX25
  54. #ifdef    AXIP
  55. static void axip __ARGS((struct iface *iface,struct ax25_cb *axp,char *src,
  56.     char *dest,struct mbuf *bp,int mcast));
  57. #endif
  58. static void axarp __ARGS((struct iface *iface,struct ax25_cb *axp,char *src,
  59.     char *dest,struct mbuf *bp,int mcast));
  60. static void axrarp __ARGS((struct iface *iface,struct ax25_cb *axp,char *src,
  61.     char *dest,struct mbuf *bp,int mcast));
  62. static void axnr __ARGS((struct iface *iface,struct ax25_cb *axp,char *src,
  63.     char *dest,struct mbuf *bp,int mcast));
  64. #endif
  65.  
  66. struct mbuf *Hopper;
  67. unsigned Nsessions = NSESSIONS;
  68.  
  69. /* Free memory threshold, below which things start to happen to conserve
  70.  * memory, like garbage collection, source quenching and refusing connects
  71.  */
  72. int32 Memthresh = MTHRESH;
  73.  
  74. int Nibufs = NIBUFS;        /* Number of interrupt buffers */
  75. unsigned Ibufsize = IBUFSIZE;    /* Size of each interrupt buffer */
  76.  
  77. /* Transport protocols atop IP */
  78. struct iplink Iplink[] = {
  79.     TCP_PTCL,    tcp_input,
  80.     UDP_PTCL,    udp_input,
  81.     ICMP_PTCL,    icmp_input,
  82.     IP_PTCL,    ipip_recv,
  83. #ifdef    AXIP
  84.     AX25_PTCL,    axip_input,
  85. #endif
  86. #ifdef    RSPF
  87.     RSPF_PTCL,    rspf_input,
  88. #endif    /* RSPF */
  89.     0,        0
  90. };
  91.  
  92. /* Transport protocols atop ICMP */
  93. struct icmplink Icmplink[] = {
  94.     TCP_PTCL,    tcp_icmp,
  95.     0,        0
  96. };
  97.  
  98. /* ARP protocol linkages */
  99. struct arp_type Arp_type[NHWTYPES] = {
  100. #ifdef    NETROM
  101.     AXALEN, 0, 0, 0, 0, NULLCHAR, pax25, setcall,    /* ARP_NETROM */
  102. #else
  103.     0, 0, 0, 0, 0, NULLCHAR,NULL,NULL,
  104. #endif
  105.  
  106. #ifdef    ETHER
  107.     EADDR_LEN,IP_TYPE,ARP_TYPE,REVARP_TYPE,1,Ether_bdcst,pether,gether, /* ARP_ETHER */
  108. #else
  109.     0, 0, 0, 0, 0, NULLCHAR,NULL,NULL,
  110. #endif
  111.  
  112.     0, 0, 0, 0, 0, NULLCHAR,NULL,NULL,        /* ARP_EETHER */
  113.  
  114. #ifdef    AX25
  115.     AXALEN, PID_IP, PID_ARP, PID_RARP, 10, Ax25multi[0], pax25, setcall,
  116. #else
  117.     0, 0, 0, 0, 0, NULLCHAR,NULL,NULL,        /* ARP_AX25 */
  118. #endif
  119.  
  120.     0, 0, 0, 0, 0, NULLCHAR,NULL,NULL,        /* ARP_PRONET */
  121.  
  122.     0, 0, 0, 0, 0, NULLCHAR,NULL,NULL,        /* ARP_CHAOS */
  123.  
  124.     0, 0, 0, 0, 0, NULLCHAR,NULL,NULL,        /* ARP_IEEE802 */
  125.  
  126. #ifdef    ARCNET
  127.     AADDR_LEN, ARC_IP, ARC_ARP, 0, 1, ARC_bdcst, parc, garc, /* ARP_ARCNET */
  128. #else
  129.     0, 0, 0, 0, 0, NULLCHAR,NULL,NULL,
  130. #endif
  131.  
  132.     0, 0, 0, 0, 0, NULLCHAR,NULL,NULL,        /* ARP_APPLETALK */
  133. };
  134.  
  135. #ifdef    AX25
  136. /* Linkage to network protocols atop ax25 */
  137. struct axlink Axlink[] = {
  138. #ifdef    AXIP
  139.     PID_IP,        axip,
  140. #endif
  141.     PID_ARP,    axarp,
  142.     PID_RARP,    axrarp,
  143. #ifdef    NETROM
  144.     PID_NETROM,    axnr,
  145. #endif
  146.     PID_NO_L3,    axnl3,
  147.     0,        NULL,
  148. };
  149. #endif
  150.  
  151. #ifndef BOOTP
  152. int WantBootp = 0;
  153.  
  154. bootp_validPacket(ip,bpp)
  155. struct ip *ip;
  156. struct mbuf **bpp;
  157. {
  158.     return 0;
  159. }
  160. #endif
  161.  
  162. #ifdef    MAILBOX
  163. void (*Listusers) __ARGS((int s)) = listusers;
  164. #else
  165. void (*Listusers) __ARGS((int s)) = NULL;
  166. #endif
  167.  
  168. /* daemons to be run at startup time */
  169. struct daemon Daemons[] = {
  170.     "killer",    1024,    killer,
  171.     "timer",    2048,    timerproc,
  172.     "network",    2048,    network,
  173.     "keyboard",    256,    keyboard,
  174.     NULLCHAR,    0,    NULLVFP
  175. };
  176.  
  177. struct iftype Iftypes[] = {
  178.     /* This entry must be first, since Loopback refers to it */
  179.     "None",        NULL,        NULL,        NULL,
  180.     NULL,        CL_NONE,    0,
  181.  
  182. #ifdef    AX25
  183.     "AX25",        ax_send,    ax_output,    pax25,
  184.     setcall,    CL_AX25,    AXALEN,
  185. #endif
  186.  
  187. #ifdef    SLIP
  188.     "SLIP",        slip_send,    NULL,        NULL,
  189.     NULL,        CL_NONE,    0,
  190. #endif
  191.  
  192. #ifdef    ETHER
  193.     /* Note: NULL is specified for the scan function even though
  194.      * gether() exists because the packet drivers don't support
  195.      * address setting.
  196.      */
  197.     "Ethernet",    enet_send,    enet_output,    pether,
  198.     NULL,        CL_ETHERNET,    EADDR_LEN,
  199. #endif
  200.  
  201. #ifdef    NETROM
  202.     "NETROM",    nr_send,    NULL,        pax25,
  203.     setcall,    CL_NETROM,    AXALEN,
  204. #endif
  205.  
  206. #ifdef    SLFP
  207.     "SLFP",        pk_send,    NULL,        NULL,
  208.     NULL,        CL_NONE,    0,
  209. #endif
  210.  
  211. #ifdef    PPP
  212.     "PPP",        ppp_send,    ppp_output,    NULL,
  213.     NULL,        CL_PPP,    0,
  214. #endif
  215.  
  216.     NULLCHAR
  217. };
  218.  
  219. /* Command lookup and branch tables */
  220. struct cmds Cmds[] = {
  221.     /* The "go" command must be first */
  222.     "",        go,        0, 0, NULLCHAR,
  223. #ifndef    AMIGA
  224.     "!",        doshell,    0, 0, NULLCHAR,
  225. #endif
  226.     "abort",    doabort,    0, 0, NULLCHAR,
  227. #ifdef    AMIGA
  228.     "amiga",    doamiga,    0, 0, NULLCHAR,
  229. #endif
  230. #if    (defined(MAC) && defined(APPLETALK))
  231.     "applestat",    doatstat,    0,    0, NULLCHAR,
  232. #endif
  233. #if    (defined(AX25) || defined(ETHER) || defined(APPLETALK))
  234.     "arp",        doarp,        0, 0, NULLCHAR,
  235. #endif
  236. #ifdef    ASY
  237.     "asystat",    doasystat,    0, 0, NULLCHAR,
  238. #endif
  239.     "attach",    doattach,    0, 2,
  240.         "attach <hardware> <hw specific options>",
  241.     "attended",    doattended,    0, 0, NULLCHAR,
  242. #ifdef    AX25
  243.     "ax25",        doax25,        0, 0, NULLCHAR,
  244. #endif    
  245. #ifdef    MAILBOX
  246.     "bbs",        dobbs,        1024, 0, NULLCHAR,
  247. #endif
  248. #ifdef    BOOTP
  249.         "bootp",        dobootp,        0, 0, NULLCHAR,
  250.     "bootpd",    bootpdcmd,     0, 0, NULLCHAR,
  251. #endif
  252.  
  253. /* This one is out of alpabetical order to allow abbreviation to "c" */
  254. #ifdef    AX25
  255.     "connect",    doconnect,    1024, 3,
  256.     "connect <interface> <callsign>",
  257. #endif
  258. #if    !defined(UNIX) && !defined(AMIGA)
  259.     "cd",        docd,        0, 0, NULLCHAR,
  260. #endif
  261.     "close",    doclose,    0, 0, NULLCHAR,
  262.     "comm",        doasycomm,    0, 3,"comm <interface> <text-string>",
  263. /* This one is out of alpabetical order to allow abbreviation to "d" */
  264.     "disconnect",    doclose,    0, 0, NULLCHAR,
  265. #ifndef    AMIGA
  266.     "dir",        dodir,        512, 0, NULLCHAR, /* note sequence */
  267. #endif
  268.     "delete",    dodelete,    0, 2, "delete <file>",
  269.     "detach",    dodetach,    0, 2, "detach <interface>",
  270. #ifdef    DIALER
  271.     "dialer",    dodialer,    512, 3,
  272.     "dialer <iface> [<file> [<seconds> [<pings> [<hostid>]]]]",
  273. #endif
  274.     "domain",    dodomain,    0, 0, NULLCHAR,
  275. #ifdef    DRSI
  276.     "drsistat",    dodrstat,    0, 0, NULLCHAR,
  277. #endif
  278.     "dump",        domdump,    0, 0, NULLCHAR,
  279. #ifdef    HS
  280.     "hs",        dohs,        0, 0, NULLCHAR,
  281. #endif
  282. #ifdef    EAGLE
  283.     "eaglestat",    doegstat,    0, 0, NULLCHAR,
  284. #endif
  285.     "echo",        doecho,        0, 0, NULLCHAR,
  286.     "eol",        doeol,        0, 0, NULLCHAR,
  287. #if    (!defined(MSDOS) || defined(ESCAPE))
  288.     "escape",    doescape,    0, 0, NULLCHAR,
  289. #endif
  290. #ifdef    PC_EC
  291.     "etherstat",    doetherstat,    0, 0, NULLCHAR,
  292. #endif
  293.     "exit",        doexit,        0, 0, NULLCHAR,
  294.     "finger",    dofinger,    1024, 2, "finger name@host",
  295.     "fkey",        dofkey,        0, 0, NULLCHAR,
  296.     "ftp",        doftp,        2048, 2, "ftp <address>",
  297.     "ftype",    doftype,    0, 0, NULLCHAR,
  298. #ifdef HAPN
  299.     "hapnstat",    dohapnstat,    0, 0, NULLCHAR,
  300. #endif
  301.     "help",        dohelp,        0, 0, NULLCHAR,
  302. #ifdef    HOPCHECK
  303.     "hop",        dohop,        0, 0, NULLCHAR,
  304. #endif
  305.     "hostname",    dohostname,    0, 0, NULLCHAR,
  306. #ifdef    HS
  307.     "hs",        dohs,        0, 0, NULLCHAR,
  308. #endif
  309.     "icmp",        doicmp,        0, 0, NULLCHAR,
  310.     "ifconfig",    doifconfig,    0, 0, NULLCHAR,
  311.     "info",        doinfo,        0, 0, NULLCHAR,
  312.     "ip",        doip,        0, 0, NULLCHAR,
  313. #ifdef    MSDOS
  314.     "isat",        doisat,        0, 0, NULLCHAR,
  315. #endif    
  316.     "kick",        dokick,        0, 0, NULLCHAR,
  317.     "log",        dolog,        0, 0, NULLCHAR,
  318.     "mail",        dobmail,    0, 0, NULLCHAR,
  319. #ifdef    MAILBOX
  320.     "mbox",        dombox,        0, 0, NULLCHAR,
  321. #endif
  322. #ifndef    UNIX
  323.     "memory",    domem,        0, 0, NULLCHAR,
  324. #endif
  325.     "mkdir",    domkd,        0, 2, "mkdir <directory>",
  326. #ifdef    AX25
  327.     "mode",        domode,        0, 2, "mode <interface>",
  328. #endif
  329.     "more",        domore,        512, 2, "more <filename>",
  330.     "motd",        domotd,        0, 0, NULLCHAR,
  331. #ifdef    MSDOS
  332.     "multitask",    dobackg,    0, 0, NULLCHAR,
  333. #endif
  334. #ifdef    NETROM
  335.     "netrom",    donetrom,    0, 0, NULLCHAR,
  336. #endif    /* NETROM */
  337. #ifdef    NNTP
  338.     "nntp",        donntp,        0, 0, NULLCHAR,
  339. #endif
  340. #if    (defined(NETROM) || defined(NRS))
  341.     "nrstat",    donrstat,    0, 0, NULLCHAR,
  342. #endif    /* NETROM && NRS */
  343.     "param",    doparam,    0, 2, "param <interface>",
  344.     "ping",        doping,        512, 2,
  345.     "ping <hostid> [<length> [<interval> [incflag]]]",
  346. #ifdef    PI
  347.     "pistatus",    dopistat,    0, 0, NULLCHAR,
  348. #endif
  349. #ifdef    POP
  350.     "pop",        dopop,        0, 0, NULLCHAR,
  351. #endif
  352. #ifdef PPP
  353.     "ppp",        doppp_commands,    0, 0, NULLCHAR,
  354. #endif
  355.     "ps",        ps,        0, 0, NULLCHAR,
  356. #if    !defined(UNIX) && !defined(AMIGA)
  357.     "pwd",        docd,        0, 0, NULLCHAR,
  358. #endif
  359. #if    (defined(AX25) || defined(ETHER))
  360.     "rarp",        dorarp,        0, 0, NULLCHAR,
  361. #endif
  362.     "record",    dorecord,    0, 0, NULLCHAR,
  363.     "remote",    doremote,    0, 3, "remote [-p port] [-k key] [-a kickaddr] <address> exit|reset|kick",
  364.     "rename",    dorename,    0, 3, "rename <oldfile> <newfile>",
  365.     "reset",    doreset,    0, 0, NULLCHAR,
  366. #ifdef    RIP
  367.     "rip",        dorip,        0, 0, NULLCHAR,
  368. #endif
  369. #ifdef    RLOGINCLI
  370.     "rlogin",    dorlogin,    2048, 2, "rlogin <address>",
  371. #endif
  372.     "rmdir",    dormd,        0, 2, "rmdir <directory>",
  373.     "route",    doroute,    0, 0, NULLCHAR,
  374. #ifdef    RSPF
  375.     "rspf",        dorspf,        0, 0, NULLCHAR,
  376. #endif    /* RSPF */
  377.     "session",    dosession,    0, 0, NULLCHAR,
  378. #ifdef    SCC
  379.     "sccstat",    dosccstat,    0, 0, NULLCHAR,
  380. #endif
  381. #if    !defined(AMIGA)
  382.     "shell",    doshell,    0, 0, NULLCHAR,
  383. #endif
  384.     "smtp",        dosmtp,        0, 0, NULLCHAR,
  385.     "socket",    dosock,        0, 0, NULLCHAR,
  386.     "source",    dosource,    0, 2, "source <filename>",
  387. #ifdef    SERVERS
  388.     "start",    dostart,    0, 2, "start <servername>",
  389.     "stop",        dostop,        0, 2, "stop <servername>",
  390. #endif
  391.     "status",    dostatus,    0, 0, NULLCHAR,
  392.     "tcp",        dotcp,        0, 0, NULLCHAR,
  393.     "tail",        dotail,        0, 2, "tail <filename>",
  394.     "telnet",    dotelnet,    1024, 2, "telnet <address>",
  395.     "test",        dotest,        0, 0, NULLCHAR,
  396.     "ttylink",    dottylink,    1024, 2, "ttylink <address>",
  397. #ifdef    MAILBOX
  398.     "third-party",    dothirdparty,    0, 0, NULLCHAR,
  399. #endif
  400.     "tip",        dotip,        256, 2, "tip <iface (asyc only!)>",
  401. #ifdef    TRACE
  402.     "trace",    dotrace,    0, 0, NULLCHAR,
  403. #endif
  404.     "udp",        doudp,        0, 0, NULLCHAR,
  405.     "upload",    doupload,    0, 0, NULLCHAR,
  406. #ifdef    MSDOS
  407.     "watch",    doswatch,    0, 0, NULLCHAR,
  408.     "watchdog",    dowatchdog,    0, 0, NULLCHAR,
  409. #endif
  410.     "?",        dohelp,        0, 0, NULLCHAR,
  411.     NULLCHAR,    NULLFP,        0, 0,
  412.         "Unknown command; type \"?\" for list",
  413. };
  414.  
  415. /* List of supported hardware devices */
  416. struct cmds Attab[] = {
  417. #ifdef    PC_EC
  418.     /* 3-Com Ethernet interface */
  419.     "3c500", ec_attach, 0, 7, 
  420.     "attach 3c500 <address> <vector> arpa <label> <buffers> <mtu> [ip_addr]",
  421. #endif
  422. #ifdef    ASY
  423.     /* Ordinary PC asynchronous adaptor */
  424.     "asy",    asy_attach, 0, 8, 
  425. #ifndef    AMIGA
  426. #ifdef    NRS
  427. #ifdef    PPP
  428.     "attach asy <address> <vector> slip|ax25|nrs|ppp <label> <buffers> <mtu> <speed> [options]",
  429. #else    /* PPP */
  430.     "attach asy <address> <vector> slip|ax25|nrs <label> <buffers> <mtu> <speed> [options]",
  431. #endif    /* PPP */
  432. #else    /* NRS */
  433. #ifdef    PPP
  434.     "attach asy <address> <vector> slip|ax25|ppp <label> <buffers> <mtu> <speed> [options]",
  435. #else    /* PPP */
  436.     "attach asy <address> <vector> slip|ax25 <label> <buffers> <mtu> <speed> [options]",
  437. #endif    /* PPP */
  438. #endif    /* NRS */
  439. #else
  440. #ifdef    NRS
  441. #ifdef    PPP
  442.      "attach asy <driver> <unit> slip|ax25|nrs|ppp <label> <buffers> <mtu> <speed> [options]",
  443. #else    /* PPP */
  444.      "attach asy <driver> <unit> slip|ax25|nrs <label> <buffers> <mtu> <speed> [options]",
  445. #endif    /* PPP */
  446. #else    /* NRS */
  447. #ifdef    PPP
  448.      "attach asy <driver> <unit> slip|ax25|ppp <label> <buffers> <mtu> <speed> [options]",
  449. #else    /* PPP */
  450.      "attach asy <driver> <unit> slip|ax25 <label> <buffers> <mtu> <speed> [options]",
  451. #endif    /* PPP */
  452. #endif    /* NRS */
  453. #endif    /* AMIGA */
  454. #endif    /* ASY */
  455. #ifdef    KISS
  456.     /* Multi-port KISS interface piggy-backing on ASY interface. */
  457.     "kiss", kiss_attach, 0, 4, 
  458.     "attach kiss <asy_interface_label> <port> <label> [mtu]",
  459. #endif    /* KISS */
  460. #ifdef    PC100
  461.     /* PACCOMM PC-100 8530 HDLC adaptor */
  462.     "pc100", pc_attach, 0, 8, 
  463.     "attach pc100 <address> <vector> ax25 <label> <buffers>\
  464.  <mtu> <speed> [ip_addra] [ip_addrb]",
  465. #endif
  466. #ifdef    DRSI
  467.     /* DRSI PCPA card in low speed mode */
  468.     "drsi", dr_attach, 0, 8,
  469.     "attach drsi <address> <vector> ax25 <label> <bufsize> <mtu>\
  470. <chan a speed> <chan b speed> [ip addr a] [ip addr b]",
  471. #endif
  472. #ifdef    EAGLE
  473.     /* EAGLE RS-232C 8530 HDLC adaptor */
  474.     "eagle", eg_attach, 0, 8,
  475.     "attach eagle <address> <vector> ax25 <label> <buffers>\
  476.  <mtu> <speed> [ip_addra] [ip_addrb]",
  477. #endif
  478. #ifdef    HAPN
  479.     /* Hamilton Area Packet Radio (HAPN) 8273 HDLC adaptor */
  480.     "hapn", hapn_attach, 0, 8,
  481.     "attach hapn <address> <vector> ax25 <label> <rx bufsize>\
  482.  <mtu> csma|full [ip_addr]",
  483. #endif
  484. #ifdef    APPLETALK
  485.     /* Macintosh AppleTalk */
  486.     "0", at_attach, 0, 7,
  487.     "attach 0 <protocol type> <device> arpa <label> <rx bufsize> <mtu> [ip_addr]",
  488. #endif
  489. #ifdef NETROM
  490.     /* fake netrom interface */
  491.     "netrom", nr_attach, 0, 1,
  492.     "attach netrom [ip_addr]",
  493. #endif
  494. #ifdef    PACKET
  495.     /* FTP Software's packet driver spec */
  496.     "packet", pk_attach, 0, 4,
  497.     "attach packet <int#> <label> <buffers> <mtu> [ip_addr]",
  498. #endif
  499. #ifdef    HS
  500.     /* Special high speed driver for DRSI PCPA or Eagle cards */
  501.     "hs", hs_attach, 0, 7,
  502.     "attach hs <address> <vector> ax25 <label> <buffers> <mtu>\
  503.  <txdelay> <persistence> [ip_addra] [ip_addrb]",
  504. #endif
  505. #ifdef    PI
  506.     /* Special high speed driver for PI 8530 HDLC adapter */
  507.     "pi", pi_attach, 0, 8,
  508.     "attach pi <address> <vector> <dmachannel> ax25 <label> <buffers>\
  509.     <mtu> <speed a> <speed b> [ip_addra] [ip_addrb]",
  510. #endif
  511. #ifdef SCC
  512.     "scc", scc_attach, 0, 7,
  513.      "attach scc <devices> init <addr> <spacing> <Aoff> <Boff> <Dataoff>\n"
  514.     "   <intack> <vec> [p]<clock> [hdwe] [param]\n"
  515.     "attach scc <chan> slip|kiss|nrs|ax25 <label> <mtu> <speed> <bufsize> [call] ",
  516. #endif
  517. #ifdef AXIP
  518.     "axip",axip_attach, 0, 4,
  519.     "attach axip <name> <mtu> <remote-hostid> [callsign]",
  520. #endif
  521.     NULLCHAR,
  522. };
  523.  
  524. /* Functions to be called on each clock tick */
  525. void (*Cfunc[])() = {
  526.     pctick,    /* Call PC-specific stuff to keep time */
  527.     kbint,    /* Necessary because there's no hardware keyboard interrupt */
  528.     refiq,    /* Replenish interrupt pool */
  529. #ifdef    ASY
  530.     asytimer,
  531. #endif
  532. #ifdef    SCC
  533.     scctimer,
  534. #endif
  535.     NULL,
  536. };
  537.  
  538. /* Entry points for garbage collection */
  539. void (*Gcollect[])() = {
  540.     tcp_garbage,
  541.     ip_garbage,
  542.     udp_garbage,
  543.     st_garbage,
  544. #ifdef    AX25
  545.     lapb_garbage,
  546. #endif
  547. #ifdef    NETROM
  548.     nr_garbage,
  549. #endif
  550.     NULL
  551. };
  552.  
  553. /* Functions to be called at shutdown */
  554. void (*Shutdown[])() = {
  555. #ifdef SCC
  556.     sccstop,
  557. #endif
  558.     uchtimer,    /* Unlink timer handler from timer chain */
  559.     NULLVFP,
  560. };
  561.  
  562. /* Packet tracing stuff */
  563. #ifdef    TRACE
  564. #include "trace.h"
  565.  
  566. /* Protocol tracing function pointers. Matches list of class definitions
  567.  * in pktdrvr.h.
  568.  */
  569. struct trace Tracef[] = {
  570.     NULLFP,        ip_dump,    /* CL_NONE */
  571.  
  572. #ifdef    ETHER                /* CL_ETHERNET */
  573.     ether_forus,    ether_dump,
  574. #else
  575.     NULLFP,        NULLVFP,
  576. #endif    /* ETHER */
  577.  
  578.     NULLFP,        NULLVFP,    /* CL_PRONET_10 */
  579.     NULLFP,        NULLVFP,    /* CL_IEEE8025 */
  580.     NULLFP,        NULLVFP,    /* CL_OMNINET */
  581.  
  582. #ifdef    APPLETALK
  583.     at_forus,    at_dump,    /* CL_APPLETALK */
  584. #else
  585.     NULLFP,        NULLVFP,
  586. #endif    /* APPLETALK */
  587.  
  588. #ifdef VJCOMPRESS
  589.     NULLFP,        sl_dump,    /* CL_SERIAL_LINE */
  590. #else
  591.     NULLFP,        ip_dump,    /* CL_SERIAL_LINE */
  592. #endif
  593.     NULLFP,        NULLVFP,    /* CL_STARLAN */
  594.  
  595. #ifdef    ARCNET
  596.     arc_forus,    arc_dump,    /* CL_ARCNET */
  597. #else
  598.     NULLFP,        NULLVFP,
  599. #endif    /* ARCNET */
  600.  
  601. #ifdef    AX25
  602.     ax_forus,    ax25_dump,    /* CL_AX25 */
  603. #else
  604.     NULLFP,        NULLVFP,
  605. #endif    /* AX25 */
  606.  
  607. #ifdef    KISS                /* CL_KISS */
  608.     ki_forus,    ki_dump,
  609. #else
  610.     NULLFP,        NULLVFP,
  611. #endif    /* KISS */
  612.  
  613.     NULLFP,        NULLVFP,    /* CL_IEEE8023 */
  614.     NULLFP,        NULLVFP,    /* CL_FDDI */
  615.     NULLFP,        NULLVFP,    /* CL_INTERNET_X25 */
  616.     NULLFP,        NULLVFP,    /* CL_LANSTAR */
  617. #ifdef    SLFP
  618.     NULLFP,        ip_dump,    /* CL_SLFP */
  619. #else
  620.     NULLFP,        NULLVFP,
  621. #endif    /* SLFP */
  622.  
  623. #ifdef    NETROM                /* CL_NETROM */
  624.     NULLFP,        ip_dump,
  625. #else
  626.     NULLFP,        NULLVFP,
  627. #endif
  628.  
  629. #ifdef PPP
  630.     NULLFP,        ppp_dump,    /* CL_PPP */
  631. #else
  632.     NULLFP,        NULLVFP,
  633. #endif /* PPP */
  634. };
  635.  
  636. #else    /* TRACE */
  637.  
  638. /* Stub for packet dump function */
  639. void
  640. dump(iface,direction,type,bp)
  641. struct iface *iface;
  642. int direction;
  643. unsigned type;
  644. struct mbuf *bp;
  645. {
  646. }
  647. void
  648. raw_dump(iface,direction,bp)
  649. struct iface *iface;
  650. int direction;
  651. struct mbuf *bp;
  652. {
  653. }
  654.  
  655. #endif    /* TRACE */
  656.  
  657.  
  658. #ifdef    AX25
  659. /* Hooks for passing incoming AX.25 data frames to network protocols */
  660. #ifdef    AXIP
  661. static void
  662. axip(iface,axp,src,dest,bp,mcast)
  663. struct iface *iface;
  664. struct ax25_cb *axp;
  665. char *src;
  666. char *dest;
  667. struct mbuf *bp;
  668. int mcast;
  669. {
  670.     (void)ip_route(iface,bp,mcast);
  671. }
  672. #endif
  673.  
  674. static void
  675. axarp(iface,axp,src,dest,bp,mcast)
  676. struct iface *iface;
  677. struct ax25_cb *axp;
  678. char *src;
  679. char *dest;
  680. struct mbuf *bp;
  681. int mcast;
  682. {
  683.     (void)arp_input(iface,bp);
  684. }
  685.  
  686. static void
  687. axrarp(iface,axp,src,dest,bp,mcast)
  688. struct iface *iface;
  689. struct ax25_cb *axp;
  690. char *src;
  691. char *dest;
  692. struct mbuf *bp;
  693. int mcast;
  694. {
  695.     (void)rarp_input(iface,bp);
  696. }
  697.  
  698. #ifdef    NETROM
  699. static void
  700. axnr(iface,axp,src,dest,bp,mcast)
  701. struct iface *iface;
  702. struct ax25_cb *axp;
  703. char *src;
  704. char *dest;
  705. struct mbuf *bp;
  706. int mcast;
  707. {
  708.     if(!mcast)
  709.         nr_route(bp,axp);
  710.     else
  711.         nr_nodercv(iface,src,bp);
  712. }
  713.  
  714. #endif    /* NETROM */
  715. #endif    /* AX25 */
  716.  
  717. #ifndef    RIP
  718. /* Stub for routing timeout when RIP is not configured -- just remove entry */
  719. void
  720. rt_timeout(s)
  721. void *s;
  722. {
  723.     struct route *stale = (struct route *)s;
  724.  
  725.     rt_drop(stale->target,stale->bits);
  726. }
  727. #endif
  728.  
  729. #ifdef    SERVERS
  730. /* "start" and "stop" subcommands */
  731. static struct cmds Startcmds[] = {
  732. #if    defined(AX25) && defined(MAILBOX)
  733.     "ax25",        ax25start,    256, 0, NULLCHAR,
  734. #endif
  735.     "discard",    dis1,        256, 0, NULLCHAR,
  736.     "echo",        echo1,        256, 0, NULLCHAR,
  737.     "finger",    finstart,    256, 0, NULLCHAR,
  738.     "ftp",        ftpstart,    256, 0, NULLCHAR,
  739. #if    defined(NETROM) && defined(MAILBOX)
  740.     "netrom",    nr4start,    256, 0, NULLCHAR,
  741. #endif
  742. #ifdef    POP
  743.     "pop",        pop1,        256, 0, NULLCHAR,
  744. #endif
  745. #ifdef    RIP
  746.     "rip",        doripinit,    0,   0, NULLCHAR,
  747. #endif
  748.     "smtp",        smtp1,        512, 0, NULLCHAR,
  749. #if    defined(MAILBOX)
  750.     "telnet",    telnet1,    256, 0, NULLCHAR,
  751.     "tip",        tipstart,    256, 2, "start tip <interface>",
  752. #endif
  753.     "ttylink",    ttylstart,    256, 0, NULLCHAR,
  754.     "remote",    rem1,        768, 0, NULLCHAR,
  755.     NULLCHAR,
  756. };
  757. static struct cmds Stopcmds[] = {
  758. #if    defined(AX25) && defined(MAILBOX)
  759.     "ax25",        ax250,        0, 0, NULLCHAR,
  760. #endif
  761.     "discard",    dis0,        0, 0, NULLCHAR,
  762.     "echo",        echo0,        0, 0, NULLCHAR,
  763.     "finger",    fin0,        0, 0, NULLCHAR,
  764.     "ftp",        ftp0,        0, 0, NULLCHAR,
  765. #if    defined(NETROM) && defined(MAILBOX)
  766.     "netrom",    nr40,        0, 0, NULLCHAR,
  767. #endif
  768. #ifdef    POP
  769.     "pop",        pop0,        0, 0, NULLCHAR,
  770. #endif
  771. #ifdef    RIP
  772.     "rip",        doripstop,    0, 0, NULLCHAR,
  773. #endif
  774.     "smtp",        smtp0,        0, 0, NULLCHAR,
  775. #ifdef    MAILBOX
  776.     "telnet",    telnet0,    0, 0, NULLCHAR,
  777.     "tip",        tip0,        0, 2, "stop tip <interface>",
  778. #endif
  779.     "ttylink",    ttyl0,        0, 0, NULLCHAR,
  780.     "remote",    rem0,        0, 0, NULLCHAR,
  781.     NULLCHAR,
  782.  
  783. };
  784. static int
  785. dostart(argc,argv,p)
  786. int argc;
  787. char *argv[];
  788. void *p;
  789. {
  790.     return subcmd(Startcmds,argc,argv,p);
  791. }
  792. static int
  793. dostop(argc,argv,p)
  794. int argc;
  795. char *argv[];
  796. void *p;
  797. {
  798.     return subcmd(Stopcmds,argc,argv,p);
  799. }
  800. #endif    /* SERVERS */
  801.  
  802. /* Various configuration-dependent functions */
  803.  
  804. /* put mbuf into Hopper for network task
  805.  * returns 0 if OK
  806.  */
  807. int
  808. net_route(ifp, type, bp)
  809. struct iface *ifp;
  810. int type;
  811. struct mbuf *bp;
  812. {
  813.     struct mbuf *nbp;
  814.     struct phdr phdr;
  815.  
  816.     phdr.iface = ifp;
  817.     phdr.type = type;
  818.  
  819.     if ((nbp = pushdown(bp,sizeof(phdr))) == NULLBUF ){
  820.         return -1;
  821.     }
  822.     memcpy( &nbp->data[0],(char *)&phdr,sizeof(phdr));
  823.     enqueue(&Hopper,nbp);
  824.     /* Especially on slow machines, serial I/O can be quite
  825.      * compute intensive, so release the machine before we
  826.      * do the next packet.  This will allow this packet to
  827.      * go on toward its ultimate destination. [Karn]
  828.      */
  829.     pwait(NULL);
  830.     return 0;
  831. }
  832.  
  833. /* Process packets in the Hopper */
  834. static void
  835. network(i,v1,v2)
  836. int i;
  837. void *v1;
  838. void *v2;
  839. {
  840.     struct mbuf *bp;
  841.     struct phdr phdr;
  842.     char i_state;
  843.  
  844. loop:
  845.     refiq();    /* Replenish interrupt buffer pool */
  846.  
  847.     i_state = dirps();
  848.     while(Hopper == NULLBUF)
  849.         pwait(&Hopper);
  850.     restore(i_state);
  851.  
  852.     /* Process the input packet */
  853.     bp = dequeue(&Hopper);
  854.     pullup(&bp,(char *)&phdr,sizeof(phdr));
  855.     if(phdr.iface != NULLIF){
  856.         phdr.iface->rawrecvcnt++;
  857.         phdr.iface->lastrecv = secclock();
  858.     }
  859.     dump(phdr.iface,IF_TRACE_IN,phdr.type,bp);
  860.     switch(phdr.type){
  861. #ifdef    KISS
  862.     case CL_KISS:
  863.         kiss_recv(phdr.iface,bp);
  864.         break;
  865. #endif
  866. #ifdef    AX25
  867.     case CL_AX25:
  868.         ax_recv(phdr.iface,bp);
  869.         break;
  870. #endif
  871. #ifdef    ETHER
  872.     case CL_ETHERNET:
  873.         eproc(phdr.iface,bp);
  874.         break;
  875. #endif
  876. #ifdef ARCNET
  877.     case CL_ARCNET:
  878.         aproc(phdr.iface,bp);
  879.         break;
  880. #endif
  881. #ifdef PPP
  882.     case CL_PPP:
  883.         ppp_proc(phdr.iface,bp);
  884.         break;
  885. #endif
  886.     /* These types have no link layer protocol at the point when they're
  887.      * put in the hopper, so they can be handed directly to IP. The
  888.      * separate types are just for user convenience when running the
  889.      * "iface" command.
  890.      */
  891.     case CL_NONE:
  892.     case CL_SERIAL_LINE:
  893.     case CL_SLFP:
  894.         ip_route(phdr.iface,bp,0);
  895.         break;
  896.     default:
  897.         free_p(bp);
  898.         break;
  899.     }
  900.     /* Let everything else run - this keeps the system from wedging
  901.      * when we're hit by a big burst of packets
  902.      */
  903.     pwait(NULL);
  904.     goto loop;
  905. }
  906.  
  907. int
  908. dotest(argc,argv,p)
  909. int argc;
  910. char *argv[];
  911. void *p;
  912. {
  913.     long i;
  914.     int32 oldtime = 0;
  915.     int32 newtime;
  916.  
  917.  
  918.     Current->flowmode = 1;
  919.     for(i=0;i<40000;i++){
  920.         newtime = msclock();
  921.         if(newtime < oldtime){
  922.             tprintf("Clock slip %ld: %ld - %ld = %ld\n",i,
  923.                     newtime,oldtime,newtime-oldtime);
  924.         } else
  925.             oldtime = newtime;
  926.     }
  927.     pwait(NULL);
  928.     Current->flowmode = 0;
  929.     return 0;
  930. }
  931.  
  932.